package com.tools.service.workflow;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tools.pojo.workflow.bo.ExecutionPath;
import com.tools.pojo.workflow.po.FlowInstance;

import java.util.List;
import java.util.Map;

public interface FlowInstanceService extends IService<FlowInstance> {


    /**
     * 创建流程实例
     * @param flowDefinitionId 流程定义ID
     * @param businessKey 业务键
     * @param initialData 初始上下文数据
     * @return 流程实例
     */
    FlowInstance createInstance(Long flowDefinitionId, String businessKey, Map<String, Object> initialData);

    /**
     * 更新流程实例状态
     * @param instanceId 流程实例ID
     * @param status 新状态
     */
    void updateStatus(Long instanceId, Integer status);

    /**
     * 更新流程实例上下文数据
     * @param instanceId 流程实例ID
     * @param contextData 新上下文数据
     */
    void updateContextData(Long instanceId, Map<String, Object> contextData);

    /**
     * 更新流程实例当前节点
     * @param instanceId 流程实例ID
     * @param nodeCode 新当前节点编码
     * @param nodeName 新当前节点名称
     * @param nodeType 新当前节点类型
     */
    void updateCurrentNode(Long instanceId, String nodeCode, String nodeName, String nodeType);

    /**
     * 更新流程实例当前步骤
     * @param instanceId 流程实例ID
     * @param currentStep 新当前步骤
     */
    void updateCurrentStep(Long instanceId, String currentStep);
    /**
     * 记录节点开始执行
     * @param instanceId 流程实例ID
     * @param nodeCode 节点编码
     * @param nodeName 节点名称
     * @param nodeType 节点类型
     */
    void recordNodeStart(Long instanceId, String nodeCode, String nodeName, String nodeType);
    /**
     * 记录节点执行完成
     * @param instanceId 流程实例ID
     * @param nodeCode 节点编码
     * @param success 是否成功
     * @param message 执行消息
     * @param result 执行结果
     */
    void recordNodeComplete(Long instanceId, String nodeCode, boolean success, String message, Object result);

    /**
     * 获取流程实例执行路径
     * @param instanceId 流程实例ID
     * @return 执行路径
     */
    ExecutionPath getExecutionPath(Long instanceId);

    /**
     * 序列化执行路径为JSON字符串
     * @param executionPath 执行路径
     * @return JSON字符串
     */
    String serializeExecutionPath(ExecutionPath executionPath);

    /**
     * 解析执行路径JSON字符串为对象
     * @param executionPathJson 执行路径JSON字符串
     * @return 解析后的执行路径对象
     */
    ExecutionPath parseExecutionPath(String executionPathJson);

    /**
     * 序列化上下文数据为JSON字符串
     * @param contextData 上下文数据
     * @return JSON字符串
     */
    String serializeContextData(Map<String, Object> contextData);

     /**
     * 解析上下文数据JSON字符串为Map
     * @param contextDataJson 上下文数据JSON字符串
     * @return 解析后的上下文数据Map
     */
    Map<String, Object> parseContextData(String contextDataJson);

     /**
     * 根据业务键获取流程实例
     * @param businessKey 业务键
     * @return 流程实例
     */
    FlowInstance getByBusinessKey(String businessKey);

     /**
     * 获取所有运行中的流程实例
     * @return 运行中的流程实例列表
     */
    List<FlowInstance> getRunningInstances();

}
